/**
 * 本地存储工具类
 * 用于管理localStorage数据
 */

// 存储键名前缀，避免冲突
const STORAGE_PREFIX = 'manager_ui_';

/**
 * 获取带前缀的键名
 * @param key 原始键名
 * @returns 带前缀的键名
 */
const getPrefixedKey = (key: string): string => {
  return `${STORAGE_PREFIX}${key}`;
};

/**
 * 保存数据到localStorage
 * @param key 键名
 * @param value 要保存的数据
 */
export const saveToStorage = <T>(key: string, value: T): void => {
  try {
    const prefixedKey = getPrefixedKey(key);
    const serializedValue = JSON.stringify(value);
    localStorage.setItem(prefixedKey, serializedValue);
  } catch (error) {
    console.error('保存数据到localStorage失败:', error);
  }
};

/**
 * 从localStorage获取数据
 * @param key 键名
 * @param defaultValue 默认值，当没有找到数据时返回
 * @returns 获取的数据或默认值
 */
export const getFromStorage = <T>(key: string, defaultValue: T): T => {
  try {
    const prefixedKey = getPrefixedKey(key);
    const serializedValue = localStorage.getItem(prefixedKey);
    
    if (serializedValue === null) {
      return defaultValue;
    }
    
    return JSON.parse(serializedValue) as T;
  } catch (error) {
    console.error('从localStorage获取数据失败:', error);
    return defaultValue;
  }
};

/**
 * 从localStorage删除数据
 * @param key 键名
 */
export const removeFromStorage = (key: string): void => {
  try {
    const prefixedKey = getPrefixedKey(key);
    localStorage.removeItem(prefixedKey);
  } catch (error) {
    console.error('从localStorage删除数据失败:', error);
  }
};

/**
 * 清除所有本应用的localStorage数据
 */
export const clearStorage = (): void => {
  try {
    Object.keys(localStorage).forEach(key => {
      if (key.startsWith(STORAGE_PREFIX)) {
        localStorage.removeItem(key);
      }
    });
  } catch (error) {
    console.error('清除localStorage数据失败:', error);
  }
};

// 分页设置相关常量和工具函数
export const STORAGE_KEYS = {
  PAGINATION_SIZE: 'pagination_size',
};

/**
 * 保存分页大小设置
 * @param pageSize 分页大小
 */
export const savePaginationSize = (pageSize: number): void => {
  saveToStorage(STORAGE_KEYS.PAGINATION_SIZE, pageSize);
};

/**
 * 获取保存的分页大小设置
 * @param defaultSize 默认分页大小
 * @returns 保存的分页大小或默认值
 */
export const getPaginationSize = (defaultSize: number = 20): number => {
  return getFromStorage(STORAGE_KEYS.PAGINATION_SIZE, defaultSize);
}; 